package data
{
	import events.MutiPropertyEvent;
	
	import flash.events.EventDispatcher;
	import flash.utils.Dictionary;

	public class MutiProCommitObject extends EventDispatcher
	{
		public function MutiProCommitObject()
		{
		}
		
		/**
		 *	主动调用改变次数的临时变量。 此变量主要用来控制一些冗余的改变造成的改变<br>
		 * 	详细请看beginChanges 与 commitChanges<br>
		 */
		protected var _changeCount:int = 0;
		/**
		 *	 保存当前此此提交所发生的改变了的属性。<br>
		 * 	他用来保存以P大写字母开头静态变量属性相关的属性是否发生了改变<br>
		 * 	具体请参考onPropertiesChanged方法。与 ComponentEvent<br>
		 */
		protected var _changedPropeties:Dictionary = new Dictionary();
		protected var _lastPropertys:Dictionary = new Dictionary();
		
		/**
		 * 标识组件发生改变<br>
		 * _changeCount 小于等于0时就说明改变已经修改完成可以执行提交更新操作<br>
		 *
		 */
		public function beginChanges():void
		{
			_changeCount++;
		}
		
		/**
		 * 提交组件在beginChanges 到 commitChanges 代码段中间所操作的更新<br>
		 *  _changeCount 小于等于0时就说明改变已经修改完成可以执行提交更新操作<br>
		 *
		 */
		
		public function commitChanges():void
		{
			_changeCount--;
			if (_changeCount <= 0)
			{
				_changeCount=0;
				updateProperties();
			}
		}

		/**
		 *
		 * @param propName 所更新属性的标识。
		 * 每次更新属性的标识保存在_changedPropeties当中.
		 * 此方法会调用invalidate,尝试进行更新操作。
		 *
		 */
		protected function onPropertiesChanged(propName:String = null):void
		{
			if (propName != null)
			{
				_changedPropeties[propName]=true;
			}
			if (_changeCount <= 0)
			{
				_changeCount=0;
				updateProperties();
			}
		}
		
		/**
		 * 执行属性更新操作。 一般的属性跟新操作都要重写此方法并把属性更新操作写在此方法内。并且调用super.onProppertiesUpdate();<br>
		 * Component类由于实现了ITipedDisplay所以Component实现了添加TIP的操作.<br>
		 *
		 */
		protected function onProppertiesUpdate():void
		{
			
		}
		
		public function updateProperties():void
		{
			onProppertiesUpdate();
			var temp:Dictionary=_changedPropeties;
			var last:Dictionary=_lastPropertys;
			_changedPropeties=new Dictionary();
			_lastPropertys=new Dictionary();
			dispatchEvent(new MutiPropertyEvent(temp, last));
		}
	}
}